--tratando de hacer un switch :P
--terminar D:
function switch(value,opts)
	assert(opts)
	while true do
		--value = io.read()
		for i=1,#opts do
			if opts[i] == value then
				return opts[i]
				--break
			end
		end
	end
end

--fallido... ScreenSelectMaster no muy flexible con latejoin...
--[[
Ésta cosa se suponía que fuese una función para asignar misiones
a las choices de un selectmaster, según yo para hacerlo más ordenado
pero descarté usar selectmaster para misiones (y por consecuencia ésta
función) por varias razones: Una fue que se necesita desactivar latejoin
para que sea únicamente de 1 jugador (véase world tour nx o world max
nx2/nxa) y yo no quiero eso. Otra causa vendría siendo que, por ejemplo,
tienes planeado hacer, no sé... 50 misiones... necesitarías las acciones de
cada una de ésas 50 choices, aparte habría que revisar si está todo en
orden y ps, como que da una weba grandísima tener que revisar de una
por una las choices (más problemas habría si quieres usar iconos + cursor
para hacer un mapa estilo world max, necesitas aparte de las choices un X
y un Y para posicionar los íconos... daría un total de 50*50*50 = 150 lineas
que programar en el metrix x_x y no quieres imaginar lo que pase cuando te
salga mal UNA SOLA DE ESAS 150 y no saber cuál está mal...) y eso no és
nada práctico/cómodo... así que ps, a la basura xD (bóveda de códogos mejor :P)
]]
function SetMission(...)
	--local masterplayer = GAMESTATE:GetMasterPlayerNumber()
	local sn, mods, style, steps = ...
	
	local song = SONGMAN:GetRandomSong()
	if sn ~= nil then
		song = SONGMAN:FindSong(sn)
	end
	
	local dir = song:GetSongDir()
	
	dir = string.gsub(dir,"/Songs/","")
	dir = string.gsub(dir,"/AdditionalSongs/","")
	
	local unlocks = THEME:GetMetric("UnlockManager","UnlockNames")
	unlocks = split(",",unlocks)
	
	--[[for entry in ivalues(unlocks) do
		local unlocksongs = UNLOCKMAN:GetSongsUnlockedByEntryID(entry)
		for usong in ivalues(unlocksongs) do
			if usong:GetSongDir() == song:GetSongDir() then
				dir = "*"
			end
		end
	end]]
	
	--default values
	mods = mods or "2.5x"
	style = style or "single"
	steps = steps or "hard"
	
	local gamecommand = string.format("playmode,regular;style,%s;song,%s;steps,%s;mod,%s",style,dir,steps,mods)
	--GAMESTATE:ApplyGameCommand(gamecommand,masterplayer)
	return gamecommand
end

--Una cosa que quise tratar, tenia relación con misiones xD
function SetGamePlayMods()
	GAMESTATE:ApplyGameCommand("style,double",GAMESTATE:GetMasterPlayerNumber())
end

--Misiones segunda parte:
--[[
Otra para la bóveda de códigos... Éste método para hacer misiones me fué mucho
más práctico que hacerlo con selectmaster, pero lo tuve que rechazar por dos
razones.
La primera: Las misiones están diseñadas para que sean para un jugador solamente,
pero al unirse el otro jugador al último momento (en ScreenSelectStyle) aparecen
ambos pudiendo jugar. De seguro hay una manera de arreglarlo, pero no tengo idea;
apartir de ahí no me gustó... La segunda causa fué: Para que puedan jugarse
misiones en double habría de desactivar el latejoin, cosa que no quiero (por una
extraña razón del SM da errores de access violation y de incompatibilidad de modos
así que, bienvenido, OptionRowMission(), a la bóveda de codes :D

Tal vez te sea útil ésto si no usas latejoin y no te importa que las misiones sean de dos
jugadores (puede cau)
]]

--Falta arreglar mucho, aún está muy beta apesar de haber avanzado tanto x__x
--Por hacer: Que las opciones se puedan quedar desactivadas saltadas en vez de contiguas...
--(una si, otra no, la que sigue no y la que le sigue si, sin que una tenga las cosas de la otra y así...)
--26/feb/09 Ya pude xD
--No sé qué más le faltará... detallitos, detallitos :P ideas plz
function OptionRowMission()
	local function GetRandomSongWithCrazy()
		local song, steps, dir
		local count = 0
		while true do
			count = count+1
			--En caso de tener pocas songs con pump_single-hard (lol)
			assert(count <= 999,"OptionRowMission::GetRandomSongWithCrazy(), Search count reached 1000")
			song = SONGMAN:GetRandomSong()
			--Modificar a conveniencia de modos de juego
			steps = song:GetOneSteps('StepsType_Pump_Single','Difficulty_Hard')
			if steps then
				--separado al checar si es long o maratón
				--es que, lua usa atajos al evaluar, si en un or el primer evaluado
				--es true entonces lua dice: "¿Para qué checo el otro?"
				--Aparte, una song no puede ser long y maratón al mismo tiempo xD
				if not song:IsLong() then
					if not song:IsMarathon() then
						return song
					end
				end
			end
		end
	end
	
	--Esta tabla maneja parte de las características de las misiones
	--El resto está en <BGAnimations/ScreenEvaluationMission underlay.lua>
	local Missions = {
		{
		Name = "Random Crazy",
		Desc = "Pass a random song, have fun",
		};{
		Name = "Dummy gap",
		Desc = "A misc entry... if you didn't read this you're lucky!",
		Mods = "4x,default",
		Disabled = true,
		};{
		Name = "Initial",
		Song = "Misiones/Inicio",
		Desc = "Pass the song with Rank A or more",
		Mods = "3x,note,hidden",
		--Disabled = true,
		};{
		Name = "Unlock!",
		Desc = "By passing the previous mission you unlocked this one!",
		Steps = "medium",
		Disabled = UNLOCKMAN:GetUnlockEntry(0):IsLocked() or nil,
		};
	}
	--No editable a partir de aquí...
	
	--Reconstruir las misiones para que puedan quedar desactivadas una si, una no, la que sigue sí...
	--De ésta manera no quedan espacios nulos y no pierden su orden...
	local make = { Name = {}; Song = {}; Desc = {}; Mods = {}; Steps = {}}
	--local Name, Song, Desc, Mods, Steps = {}, {}, {}, {}, {}
	for i=1,#Missions do
		assert(Missions[i].Name,"OptionRowMission(), A Mission must have a name!")
		if not Missions[i].Disabled then
			make.Name[#make.Name+1] = Missions[i].Name
			make.Song[#make.Song+1] = Missions[i].Song or ""
			make.Desc[#make.Desc+1] = Missions[i].Desc or "??????????"
			make.Mods[#make.Mods+1] = Missions[i].Mods or "3x,default,failoff"
			make.Steps[#make.Steps+1] = Missions[i].Steps or "hard"
		end
	end
	
	local t = {
		Name = "Mission";
		LayoutType = "ShowAllInRow";
		SelectType = "SelectOne";
		OneChoiceForAllPlayers = true;
		ExportOnChange = false;
		Choices = make.Name;
		
		LoadSelections = function(self, list, pn)
			-- local currentmission = getenv("PlayedMission")
			-- if not currentmission.MissionName then
				-- list[1] = true
				-- return
			-- end
			
			list[1] = true
		end;
		
		SaveSelections = function(self, list, pn)
			local song, modifiers, steps
			for i=1,#list do
				if list[i] then
					song = SONGMAN:FindSong(make.Song[i]) or GetRandomSongWithCrazy()
					modifiers = make.Mods[i]
					steps = make.Steps[i]
					--envs...
					setenv("PlayedMission",{
						MissionName = make.Name[i];
						Description = make.Desc[i];
					})
				end
			end
			GAMESTATE:SetCurrentSong(song)
			--limpiar todo antes xD
			GAMESTATE:ApplyGameCommand("mod,clearall",pn)
			--ahora poner mods (y steps... >_>)
			GAMESTATE:ApplyGameCommand("steps,"..steps..";mod,"..modifiers,pn)
			
			PREFSMAN:SetPreference("Center1Player",true)
			--GAMESTATE:SetSongOptions('ModsLevel_Stage',"failoff")
			--GAMESTATE:GetPlayerState(pn):SetPlayerOptions( "ModsLevel_Stage", "note,3x,beat" )
		end;
	}
	setmetatable( t, t )
	return t
end

--Nivel de vida (life add)
function OptionRowLifeLevel()
	texts, value = {"Don't use"}, {0}
	for i=1,4 do
		texts[i+1] = "Level "..i.." Life"
		value[i+1] = i*0.1
	end
	
	local t = {
		Name = "Life Level";
		LayoutType = "ShowAllInRow";
		SelectType = "SelectOne";
		OneChoiceForAllPlayers = true;
		ExportOnChange = false;
		
		Choices = texts;
		LoadSelections = function(self, list, pn)
			list[1] = true
			setenv("AdditionalLife",0)
		end;
		SaveSelections = function(self, list, pn)
			for i=1,#list do
				if list[i] then
					setenv("AdditionalLife",value[i])
				end
			end
		end;
	}
	setmetatable( t, t )
	return t
end
